;
; QT-SB18.Z80 - Micromint SB180 overlay for QTERM 4.0a
;		by Steven Gold
;
; This overlay file was modeled after the Micromint SB180 overlay
; for use with Term3. (See T3M-HI3.Z80 or T3M-HI2.Z80)
;
; I have also used structures from other modem overlays. 
;
;
; The patch points indicated by the QTERM documentation have been 
; worked into the overlay, some routines have been moved around to fit
; the QTERM architecture, and others have been deleted since they do
; not apply to the QTERM program.
;
; TO USE: First edit this file with your favorite ASCII editor, changing
;		routines to conform to your hardware and changing
;		equates to conform to your implementation selections.
;		Then assemble with the SLR Systems SLR180 assembler and 
;		apply the overlay using MLOAD to the original .COM file 
;		to produce the patched .COM file.
;
; Note: While I admire David Goodenough's intentions with this software,
;	expecting most users to make their own patches with DDT, SID, or
;	whatever isn't exactly realistic. Hopefully, this overlay can be
;	used as the basis for more and better overlays to QTERM. Feel free
;	to fix and enhance as you wish!
;
;
; History:
;
;	03/22/89 - QT6-SB18 - David Goodenough supplied me with an other 
;	Steven Gold  overlay that was done for the SB-180 by Willy Gonnason of 
;	             the U. of Calgary Electrical Engineering Dept. I've used 
;                    his code for the BAUDSET and MODSET routines.
;
;	03/20/89 - QT5-SB18 - I couldn't get the Baud Rates to change properly,
; 	Steven Gold  they still need alittle work. When you enter a baud
;  	             rate with code I have it messes-up the baudrate port.
;		     Still no support for 7E1 etc. Also I 
;	             found out I was overwriting other code in certain places,
;                    the program was working so I hadn't thought to check 
;		     before.
;
;	03/18/89 - QT4-SB18 - release version
;
; Note2: The changing of baud rates still does not seem to work properly
;        and I still have not tried to set the port definitions for 7E1 etc.
;
; Note3: I use a terminal that emulates the Televideo 910 so I left the terminal
;        portion alone. 
;	   		
; *************************************************************************
;
BELL:	EQU	07h	;bell
CR:	EQU	0Dh	;carriage return
ESC:	EQU	1Bh	;escape
LF:	EQU	0Ah	;line feed
BDOS:	EQU	05H
;
YES:	EQU	0FFh
NO:	EQU	0
;
;
; Select one of the following for your computer board
;
CLK6	EQU	NO		; Yes if using 6 MHz clock
CLK9	EQU	YES		; Yes if using 9 MHz clock
Clk12	EQU	NO		; Yes if using 12 MHz clock
;
;
;
; Values shown are for a HD64180
;
;
PRINTC: EQU	0109h		;QTERM print char routine address
;
cntla	EQU	0		; ASCI Control Register A Channel 0
cntlb	EQU	2		; ASCI Control Register B Channel 0
stat	EQU	4		; ASCI Status Register Channel 0
tdr	EQU	6		; ASCI Transmit Data Register Channel 0
rdr	EQU	8		; ASCI Receive Data Register Channel 0
CTS	EQU	00100000B	; Clear-to-send input (pin 5)
DCD	EQU	00000100B	; Data Carrier detect bit (pin 8)
RDRF	EQU	10000000B	; RECEIVE DATA REGISTER FULL
TDRE	EQU	00000010B	; TRANSMIT DATA REGISTER EMPTY
;
;
;
;	Code begins here...
;
; Modem input status routine:
;
	ORG	0110h
; Input status.  Returns Z and A=0 if nothing waiting.
;
ISTAT:	CALL	IISTAT
	AND	RDRF
	RET	Z
	LD	A,0FFH
	RET
;
;
; Read Modem character routine:
;
	ORG	0120h
;
; Recieve a character
;
INP:	CALL	ISTAT
	JR	Z,INP
	IN0	A,(rdr)
	RET
;
; Modem output status routine:
;
	ORG	0130h
; Output status.  Returns Z and A=0 if not ready to send.
;
OSTAT:	CALL	IISTAT		; GET STATUS REG
	AND	TDRE
OST1:	LD	A,0FFH
	OR	A
	RET
;
; Write Modem character routine:
;
	ORG	0140h
;
OUTP:	PUSH	AF
	CALL	CKCTS		; check CTS
OUTP1:	CALL	OSTAT
	JR	Z,OUTP1
OUTP2:	POP	AF		; return point from "CTS false" delay
	OUT0	(tdr),A
	RET
;

;
; Start break routine:
;
	ORG	0150h
STRBRK:
	RET
;
; End Break routine:
;
	ORG	0160h
ENDBRK:
	RET
;
; Drop DTR routine:
;
	ORG	0170h
;Turn DTR (and RTS) OFF. (set)
dtroff:
	in0	a,(cntla)
	or	10h		; RTS off
	out0	(cntla),a
	ret

;
; Restore DTR routine:
;
	ORG	0180h
;Turn DTR (and RTS) ON. (reset)
dtron:
	in0	a,(cntla)
	and	0efh		; RTS on
	out0	(cntla),a
	ret
;
; Set Baud Rate routine:
;
;
	ORG	190H		; set serial port baud rate
BAUDSET:
	PUSH	AF
	LD	A,(BAUDSTOR)
	AND	11111000B
	POP	BC
	OR	A,B
	OUT0	(cntlb),A	; set it...
	LD	(BAUDSTOR),A
	RET



;
; Baud rate table:
;
	ORG	01A0h
; Baud Rate Tables
;
	 if	clk6
;
; HD64180 commands to set baud rates @ 6.144 MHz clock
;
BAUDTB:
	DB	00,NO		;38,400 bps disabled
	DB	01h,NO		;19,200 bps disabled
	DB	02h,No		; 9,600 bps enabled
	DB	03h,No		; 4,800 bps enabled
	DB	04h,YES		; 2,400 bps enabled
	DB	05h,YES		; 1,200 bps enabled
	DB	06h,NO		;   600 bps enabled
	DB	0dh,Yes		;   300 bps enabled
	 endif
	 if	clk9
;
; HD64180 commands to set baud rates @ 9.216 MHz clock
;
BAUDTB:
	DB	00,NO		;38,400 bps disabled
	DB	20h,NO		;19,200 bps disabled
	DB	21h,NO 		; 9,600 bps enabled
	DB	22h,NO 		; 4,800 bps enabled
	DB	23h,YES		; 2,400 bps enabled
	DB	24h,YES		; 1,200 bps enabled
	DB	25h,NO		;   600 bps enabled
	DB	26h,YES		;   300 bps enabled
	 endif
	 if	clk12
;
; HD64180 commands to set baud rates @ 12.288 MHz clock
;
BAUDTB:
	DB	00,NO		;38,400 bps disabled
	DB	02H,NO		;19,200 bps disabled
	DB	03h,NO 		; 9,600 bps enabled
	DB	04h,NO 		; 4,800 bps enabled
	DB	05h,YES		; 2,400 bps enabled
	DB	06h,YES		; 1,200 bps enabled
	DB	0Dh,NO		;   600 bps enabled
	DB	0Eh,YES		;   300 bps enabled
	 endif
;
; Communications mode setting routine:
;
;
	ORG	1B0H
SETMOD:                          ; set communication mode
	JP	SETBAUDS	  ; not enough room here...
;
;
	ORG	1C0H              ; communication mode table
MODTBL:
	DB	60H		; 7 N 1
	DB	64H		; 8 N 1
	DB	61H		; 7 N 2
	DB	65H		; 8 N 2
	DB	62H		; 7 E 1
	DB	66H		; 8 E 1
	DB	63H		; 7 E 2
	DB	67H		; 8 E 2
	DB	72H		; 7 O 1
	DB	76H		; 8 O 1
	DB	73H		; 7 O 2
	DB	77H		; 8 O 2


; Protocal Transfer Size
;
	ORG 	01CDH
	RET
;
; Processor speed
;
	ORG	01CEh
;
	 IF	CLK6
CPUSPD:	DB	06H		; Clock speed in MHz 
	 ENDIF			; CLK6
	 IF	CLK9
CPUSPD:	DB	09H		; Clock speed in MHz 
	 ENDIF			; CLK9
	 IF	CLK12
CPUSPD:	DB	12H		; Clock speed in MHz 
	 ENDIF			; CLK12

;
ESCHAR:
	DB	ESC		; escape/meta char to enable QTERM functions
;
; Signon message (max of 15 bytes plus NULL terminator byte):
;
	ORG	01D0h
SIGNON:
	DB	'Micromint SB180',0
;
; string to clear screen
;
	ORG	01F0h
CLSCRN:
	DB	'Z'-'@',0	; Control-Z on my Wyse-60 terminal

;
; GOTOXY routine (to control cursor placement):
;
	ORG	0200h
GOTOXY:
;	RET
;
;
; Terminal capability bit map:
;	these bits are set (1) if the terminal capability is present and
;	reset (0) if it is not.
;
	ORG	022Fh
TCBMAP:
	DB	11111111b
;		||||||||
;		|||||||------- bright (end highlight)
;		||||||-------- dim (start highlight)
;		|||||--------- delete line
;		||||---------- insert line
;		|||----------- delete character
;		||------------ insert character
;		|------------- clear to end of line
;		-------------- clear to end of screen
;
;

;
; Term Cap strings:
;
	ORG	0230h
STHILT:	DB	ESC,'(',00h		; 8 bytes to define start hilite...
;
	ORG	0238h
ENHILT:	DB	ESC,')',00h		; 8 bytes to define end hilite...
;
	ORG	0240h
DELINE:	DB	ESC,'R',00h		; delete line
;
	ORG	0248h
INSLIN: DB	ESC,'E',00h		; insert line
;
	ORG	0250h
DELCHR:	DB	ESC,'W',00h		; delete char
;
	ORG	0258h
INSCHR:	DB	ESC,'Q',00h		; insert char
;
	ORG	0260h
CLREOL:	DB	ESC,'T',00h		; clear to EOL
;
	ORG	0268h
CLREOS: DB	ESC,'Y',00h		; clear to end of screen
;
;
; Entry subroutine
;
	ORG 	0270H
ENTER:
	RET
;
; Exit subroutine
;
	ORG	0273H
EXIT:
	RET
;
;
; End of QTERM defined patches.
;
; begin custom patch area:
;
	ORG	0276h
;
; Read stat twice, as per Hitachi manual
;
IISTAT:	IN0	A,(stat)
	IN0	A,(stat)
	OR	A
	RET
;
; Check state of CTS* and return A=0 and Z if CTS is true.
;
CKCTS:	IN0	A,(cntlb)
	AND	CTS
	RET	Z
	LD	A,0FFh
	RET
;
SETBAUDS:
	PUSH	AF
	LD	A,(BAUDSTOR)
	POP	BC
	PUSH	BC
	BIT	4,B
	SET	4,A
	JR	NZ,NORST
	RES	4,A
NORST:
	OUT0	(cntlb),A	;set even/odd
	LD	(BAUDSTOR),A
	POP	AF
	RES	4,A		;bring up DTR
	OUT0	(cntla),A	;set parity/noparity
	RET

BAUDSTOR:
	DB	0		; storage for current baud rate.
	RET
	
;
; Custom patch area must end *PRIOR* to 0300h!!!!!
;
	END
